package com.demo.virtual_thread.selfRealize;

import java.util.List;

//载体对象（模拟虚线程的任务容器）
public class ResumableCarrier {

	private final String name;
	private final List<Runnable> steps; // 任务的所有步骤（分段逻辑）
	private int currentStepIndex = 0; // 当前执行到的步骤索引（状态保存）
	private boolean isSuspended = false;
	private boolean isCompleted = false;
	private Exception exception;

	public ResumableCarrier(String name, List<Runnable> steps) {
		this.name = name;
		this.steps = steps;
	}

	// 从当前步骤继续执行
	public void execute() throws SuspendException {
		try {
			// 从当前步骤开始执行，直到完成所有步骤或遇到挂起
			while (currentStepIndex < steps.size()) {
				System.out.printf("载体 %s 开始执行步骤 %d/%d%n", name, currentStepIndex + 1, steps.size());

				// 执行当前步骤
				steps.get(currentStepIndex).run();

				// 步骤执行完成，索引 + 1
				currentStepIndex++;

				// 如果不是最后一步，执行完后主动挂起（模拟中间阻塞场景）
				if (currentStepIndex < steps.size()) {
					System.out.printf("载体 %s 步骤 %d 完成，主动挂起 %n", name, currentStepIndex);
					isSuspended = true;
					throw new SuspendSignal(); // 挂起，等待下次恢复
				}
			}
			// 所有步骤完成
			isCompleted = true;
			System.out.printf("载体 %s 所有步骤执行完成 %n", name);
		} catch (SuspendSignal s) {
			// 捕获主动挂起信号（也可在步骤中主动抛出）
			isSuspended = true;
			throw new SuspendException();
		} catch (Exception e) {
			this.exception = e;
			isCompleted = true;
		}
	}

	// 恢复执行（重置挂起状态）
	public void resume() {
		isSuspended = false;
	}

	// getter 方法
	public String getName() {
		return name;
	}

	public boolean isSuspended() {
		return isSuspended;
	}

	public boolean isCompleted() {
		return isCompleted;
	}

	public Exception getException() {
		return exception;
	}
}